CLI Arguments
We said before that by default:
- CLI options are optional
- CLI arguments are required
当然,我们可以改变这一条规律
可选的 CLI Arguments
明确指定 typer.Argument()
来创建一个 CLI Argument
import typer
from typing_extensions import Annotated
# instead of `def main(name: str):`
def main(name: Annotated[str, typer.Argument()]):
print(f"Hello {name}")
if __name__ == "__main__":
typer.run(main)
有了 Annotated
的加持,我们可以定义一个选填的 CLI Argument 了:
name: Annotated[str | None, typer.Argument()] = None
# or
name: Annotated[str, typer.Argument()] = "Wade Wilson"
比如:
from typing import Optional
import typer
from typing_extensions import Annotated
def main(name: Annotated[Optional[str], typer.Argument()] = None):
if name is None:
print("Hello World!")
else:
print(f"Hello {name}")
if __name__ == "__main__":
typer.run(main)
notice that now [NAME]
has brackets ("[
" and "]
") around (before it was just NAME
) to denote that it's optional, not required.
动态默认值
使用 default_factory
来定义动态默认值
import random
import typer
from typing_extensions import Annotated
def get_name():
return random.choice(["Deadpool", "Rick", "Morty", "Hiro"])
def main(name: Annotated[str, typer.Argument(default_factory=get_name)]):
print(f"Hello {name}")
if __name__ == "__main__":
typer.run(main)
每次执行命令,name 都会随机变化
help 说明
使用 help
参数添加注释
import typer
from typing_extensions import Annotated
def main(name: Annotated[str, typer.Argument(help="The name of the user to greet")]):
print(f"Hello {name}")
if __name__ == "__main__":
typer.run(main)
会在 --help
中显示
设置默认值注释
当然,如果 argument 有默认值的话,它也会在 --help
中展示出来
name: Annotated[str, typer.Argument(help="Who to greet")] = "World"
使用 show_default=False
来屏蔽默认值的展示
name: Annotated[
str, typer.Argument(help="Who to greet", show_default=False)
] = "World",
使用 show_default
传入字符串,还可以自定义 argument 的默认值展示
name: Annotated[
str,
typer.Argument(
help="Who to greet", show_default="Deadpoolio the amazing's name"
),
] = "Wade Wilson",
自定义 Argument 名
默认的 Argument 名是大写的,可以使用 metavar
来自定义
import typer
from typing_extensions import Annotated
def main(name: Annotated[str, typer.Argument(metavar="✨username✨")] = "World"):
print(f"Hello {name}")
if __name__ == "__main__":
typer.run(main)

读取环境变量
use the envvar
parameter for typer.Argument()
:
name: Annotated[str, typer.Argument(envvar="AWESOME_NAME")] = "World"
name 读取的优先级:
- CLI argument
- Environment variable
- Default value

还可以定义多个环境变量,bro
name: Annotated[str, typer.Argument(envvar=["AWESOME_NAME", "GOD_NAME"])] = "World"
help 说明的展示是这样的

使用 show_envvar=False
隐藏环境变量的展示
name: Annotated[
str, typer.Argument(envvar="AWESOME_NAME", show_envvar=False)
] = "World",